package javase_class_250911;

/**
 * ClassName: TicketSafe2
 * Package: javase_class_250911
 * Description:
 *
 * @Author harkjeans
 * @Create 2025/9/11 15:14
 * @Version 1.0
 */
public class TicketSafe2 implements Runnable{
    private int ticketCount = 10;
    // 创建一个专门的锁对象（也可以用 this）
    private final Object lock = new Object();

//    @Override
//    public void run() {
//        while (true) {
//            // 使用同步代码块，只包裹需要同步的关键部分，性能更好
//            synchronized (lock) { // 获取 lock 对象的锁
//                if (ticketCount <= 0) {
//                    break;
//                }
//                try {
//                    Thread.sleep(100);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//                System.out.println(Thread.currentThread().getName() + " 卖出一张票，剩余: " + (--ticketCount));
//            } // 释放 lock 对象的锁
//        }
//    }
    @Override
    public void run() {
        while (true) {
            synchronized (this) { // 同步代码块
                if (ticketCount <= 0) {
                    break;
                }
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + " 卖出一张票，剩余: " + (--ticketCount));
            } // 同步块结束，锁在此释放
            // 释放锁后，线程可以在这里做一些不需要同步的操作（如果有的话）
            // 这给了其他线程争夺锁的机会
        }
    }
    // ... main方法同上
    public static void main(String[] args) {
        TicketSafe2 ticket = new TicketSafe2(); // 创建一个票源
        // 创建三个线程（窗口），共享同一个票源
        Thread window1 = new Thread(ticket, "窗口1");
        Thread window2 = new Thread(ticket, "窗口2");
        Thread window3 = new Thread(ticket, "窗口3");

        // 同时开始卖票
        window2.start();
        window1.start();
        window3.start();
    }
}
